package 多线程.虚假唤醒;

import java.util.concurrent.locks.LockSupport;

/**
 * @Author kirito
 * @Date 2024/1/4 16:25
 * @PackageName:多线程.虚假唤醒
 * @ClassName: lock
 * @Description:
 * 为什么可以先唤醒线程后阻塞线程
 * -----因为unpark获取了一个凭证，之后再调用park方法，就可以名正言顺的凭证消费，故不会阻塞。
 * 为什么唤醒两次后阻塞两次，但最终结果还会阻塞线程？
 * -----因为凭证的数量最多为1，连续调用两次unpark和调用一次unpark效果一样，只会增加一个凭证；
 * 而调用两次park却需要消费两个凭证，证不够，不能放行。

 * @Version 1.0
 */
public class parkUnpark03 {
    //不需要在锁块中
    public static void main(String[] args) {
        Thread a = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "\t" + "----come in");
            LockSupport.park();
            LockSupport.park();
            //park了两次，只unpark一次不会被唤醒
            System.out.println(Thread.currentThread().getName() + "\t" + "----被唤醒");
        }, "A");
        a.start();
        Thread b = new Thread(() -> {
            LockSupport.unpark(a);
            System.out.println(Thread.currentThread().getName() + "\t" + "----唤醒动作");
        }, "B");
        b.start();


    }

}
